package com.library.service.admin;

import com.library.dao.PayrecDao;
import com.library.entity.Payrec;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 付款记录业务逻辑层
 */
public class PayrecService {

    private final PayrecDao payrecDao = new PayrecDao();

    /**
     * 获取所有付款记录
     * @return 付款记录列表
     */
    public List<Payrec> getPayrecList() {
        return payrecDao.listAll();
    }

    /**
     * 分页获取付款记录列表
     * @param pageNum 页码（从1开始）
     * @param pageSize 每页显示数量
     * @return 当前页的付款记录列表
     */
    public List<Payrec> getPayrecListByPage(int pageNum, int pageSize) {
        return payrecDao.listByPage(pageNum, pageSize);
    }

    /**
     * 获取付款记录总数
     * @return 付款记录总数
     */
    public int getTotalPayrecCount() {
        return payrecDao.getTotalCount();
    }

    /**
     * 根据学号搜索付款记录并分页
     * @param sno 学号
     * @param pageNum 页码
     * @param pageSize 每页显示数量
     * @return 符合条件的付款记录列表
     */
    public List<Payrec> searchPayrecsByPage(String sno, int pageNum, int pageSize) {
        return payrecDao.searchPayrecsByPage(sno, pageNum, pageSize);
    }

    /**
     * 获取搜索结果的总数
     * @param sno 学号
     * @return 符合条件的付款记录总数
     */
    public int getSearchTotalCount(String sno) {
        return payrecDao.getSearchTotalCount(sno);
    }

    /**
     * 计算付款记录总金额
     * @param payrecList 付款记录列表
     * @return 总金额
     */
    public BigDecimal calculateTotalAmount(List<Payrec> payrecList) {
        BigDecimal totalAmount = BigDecimal.ZERO;
        if (payrecList != null) {
            for (Payrec payrec : payrecList) {
                if (payrec.getPayAmount() != null) {
                    totalAmount = totalAmount.add(payrec.getPayAmount());
                }
            }
        }
        return totalAmount;
    }

    /**
     * 根据多条件（学号、日期范围）综合查询并分页
     * @param keyword 学号关键词（可为null或空）
     * @param startDate 开始日期（可为null）
     * @param endDate 结束日期（可为null）
     * @param pageNum 页码
     * @param pageSize 每页显示数量
     * @return 符合条件的付款记录列表
     */
    public List<Payrec> searchPayrecsWithFilters(String keyword, Date startDate, Date endDate, int pageNum, int pageSize) {
        return payrecDao.searchPayrecsWithFiltersAndPage(keyword, startDate, endDate, pageNum, pageSize);
    }

    /**
     * 根据多条件（学号、日期范围）综合查询总数
     * @param keyword 学号关键词（可为null或空）
     * @param startDate 开始日期（可为null）
     * @param endDate 结束日期（可为null）
     * @return 符合条件的付款记录总数
     */
    public int getSearchCountWithFilters(String keyword, Date startDate, Date endDate) {
        return payrecDao.getCountWithFilters(keyword, startDate, endDate);
    }

    /**
     * 检查日期范围的有效性
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 如果日期范围有效返回true，否则返回false
     */
    public boolean isValidDateRange(Date startDate, Date endDate) {
        if (startDate == null || endDate == null) {
            return true; // 允许部分日期为空
        }
        return !startDate.after(endDate); // 开始日期不能晚于结束日期
    }
}